"""
该文件为UAV实体
"""
import math
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

class UAV:
    #UAV固定属性，包括导弹数量与巡航速度,初始航向
    #初始化无人机对象，包括名称与初始位置
    def __init__(self,UAV_name,Num_Missile=2,攻击半径=10000,speed=0.135):
        self.name = UAV_name
        self.NumberOfMissile = Num_Missile
        self.Position = []  # x,y,z
        self.Speed = speed  # 标量
        self.att_radius=攻击半径
        self.pointing=[0,0]     # 机头朝向，[t,p]俯仰Theta，水平偏转是Phi
        self.v_missile=0.45      # 导弹速度
        self.live=1
        self.poin_save=[0,0]        # 保存每一步的机头方向
        self.P_destroyed=0.


    #无人机运动函数，三自由度运动函数，输入为当前航向，更新当前位置,并添加进无人机轨迹;dt 外部设置步长
    # TODO (zrc) 修改无人机运动方式，改为球坐标，
    def FlightTo(self,Theta,Phi,dt):

        assert Theta >= -math.pi / 18 and Theta <= math.pi / 18, '输入角度Theta超出范围'+str(Theta)
        assert Phi >= -math.pi / 18 and Phi <= math.pi / 18, '输入角度Phi超出范围'+str(Phi)
        Theta+=self.pointing[0]
        Phi+=self.pointing[1]
        self.poin_save[0] = Theta
        self.poin_save[1] = Phi

        dx = self.Speed * math.sin(Theta) * math.cos(Phi)*dt
        dy = self.Speed * math.sin(Theta) * math.sin(Phi)*dt
        dz = self.Speed * math.cos(Theta)*dt


        self.pointing[0]=Theta
        self.pointing[1]=Phi

        # 判断该空中单位是否已被击毁，若被击毁则不进行坐标更新，若未被击毁则进行坐标更新
        if self.live == 1:
            self.Position[0] += dx
            self.Position[1] += dy
            self.Position[2] += dz

        if self.Position[2]<0:self.live=0

    def Attack(self, pos):   # TODO （zrc） 验证是否有弹，有弹则可以攻击返回True
        r=self.distance_xyz(self.Position,pos)
        if self.NumberOfMissile > 0 and r<self.att_radius:
            self.NumberOfMissile -= 1
            return True
        else:
            return False

    def distance_xyz(self,A,B):
        x=B[0]-A[0]
        y = B[1] - A[1]
        z = B[2] - A[2]
        dis=math.sqrt(x**2+y**2+z**2)
        return dis